package cn.lingyangwl.agile.model.module.mq;

import cn.hutool.core.util.RandomUtil;
import cn.lingyangwl.agile.model.constants.*;
import cn.lingyangwl.agile.model.module.tenant.*;
import com.alibaba.fastjson2.JSON;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import javax.validation.constraints.NotEmpty;
import java.util.Objects;

/**
 * @author shenguangyang
 */
@Getter
@Setter
@ToString
public class BaseMqPayload {
    protected String msgId = RandomUtil.randomString(32);

    /**
     * 原始客户端请求的租户id, {@link #tenantId} 在业务处理过程中可能会被临时修改成其他的租户id, 但是在作用的代码块中,
     * 可能还要获取客户端传递的租户id, 就可以直接从该字段获取
     */
    private String rawTenantId;

    /**
     * 租户id
     */
    @NotEmpty(message = ValidationCons.NOT_EMPTY)
    protected String tenantId;

    /**
     * 主租户
     */
    protected String mainTenantId;

    protected String mgtSceneTenantId;

    public BaseMqPayload() {

    }

    /**
     * 初始化工作空间相关参数
     */
    public void initWorkspace() {
        if (Objects.isNull(this.tenantId)) {
            this.tenantId = TenantContext.get().getTenantId();
        }
        if (Objects.isNull(this.mainTenantId)) {
            this.mainTenantId = TenantContext.get().getMainTenantId();
        }

        if (Objects.isNull(this.mgtSceneTenantId)) {
            this.mgtSceneTenantId = TenantContext.get().getMgtSceneTenantId();
        }

        if (Objects.isNull(this.rawTenantId)) {
            this.rawTenantId = TenantContext.get().getRawTenantId();
        }
    }

    public String toMessage() {
        this.initWorkspace();
        return JSON.toJSONString(this);
    }


    public static <T extends BaseMqPayload> T parse(String msg, Class<T> tClass) {
        T t = JSON.parseObject(msg, tClass);
        TenantContext.get().setTenantId(t.getTenantId());
        TenantContext.get().setMainTenantId(t.getMainTenantId());
        TenantContext.get().setMgtSceneTenantId(t.getMgtSceneTenantId());
        TenantContext.get().setRawTenantId(String.valueOf(t.getRawTenantId()));
        return t;
    }
}
